﻿using System;

namespace LAPI.Business.Gestores
{
    /// <summary>
    /// Clase que implementa funciones para gestionar operaciones sobre la entidad de base de datos 'CentroDeportivo'
    /// </summary>
    public class GestorCentrosDeportivos
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public GestorCentrosDeportivos()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(GestorCentrosDeportivos));
        }

        #region Getter
        /// <summary>
        /// Método para obtener un listado de todos los centros deportivos (activos y no activos)
        /// </summary>
        /// <returns>Una colección del modelo con todos los centros deportivos</returns>
        /// <seealso cref="CentroDeportivo"/>
        /// <seealso cref="GestorBBDD"/>
        public System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> ObtenerTodos()
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.CentroDeportivo.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }           
        }

        /// <summary>
        /// Método para obtener un listado de todos los centros deportivos activos
        /// </summary>
        /// <returns>Una colección del modelo con todos los centros deportivos activos</returns>
        public System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> ObtenerActivos()
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" where activo = 1");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.CentroDeportivo.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }

        /// <summary>
        /// Método para obtener los datos de un Centro Deportivo, sabiendo su identificador único
        /// </summary>
        /// <param name="IdCentroDeportivo">Int con el identificador único del Centro Deportivo</param>
        /// <returns>modelo CentroDeportivo con los datos</returns>
        public LAPI.Data.Model.CentroDeportivo ObtenerPorID(Int32 IdCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" where id_centrodeportivo = " + IdCentroDeportivo);

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.CentroDeportivo.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial(); 
                return result[0];
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }


        /// <summary>
        /// Método para filtrar una busqueda de Centro Deportivo por alguno de estos campos:
        /// <ul>
        /// <li>Descripcion</li>
        /// <li>Direccion</li>
        /// <li>Telefono</li>
        /// <li>Identificador</li>
        /// </ul>
        /// </summary>
        /// <param name="filtroBusqueda">Diccionario con el filtro de la búsqueda</param>
        /// <returns>Una colección del modelo con todos los centros deportivos</returns>
        public System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> ObtenerBusqueda(System.Collections.Hashtable filtroBusqueda)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            System.Collections.Generic.List<LAPI.Data.Model.CentroDeportivo> result;

            sql.Append("Select ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Columns);
            sql.Append(" from ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" where 1=1 ");

            //Añadimos filtros
            if (filtroBusqueda.ContainsKey("descripcion"))
                sql.Append(" and descripcion like '%" + filtroBusqueda["descripcion"].ToString().Replace('*','%') + "%'");

            if (filtroBusqueda.ContainsKey("direccion"))
                sql.Append(" and direccion like '%" + filtroBusqueda["direccion"].ToString().Replace('*', '%') + "%'");

            if (filtroBusqueda.ContainsKey("telefono"))
                sql.Append(" and telefono like '%" + filtroBusqueda["telefono"].ToString().Replace('*', '%') + "%'");

            if (filtroBusqueda.ContainsKey("idCentroDeportivo"))
                sql.Append(" and id_centrodeportivo like '%" + filtroBusqueda["idCentroDeportivo"].ToString().Replace('*', '%') + "%'");

            try
            {
                oBBDD.Abrir();
                result = LAPI.Data.Model.CentroDeportivo.toModel(oBBDD.Select(sql.ToString()));
                oBBDD.CerrarParcial();
                return result;
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                return null;
            }
        }
    #endregion

        #region Comprobaciones
       

#endregion

        #region insert

        /// <summary>
        /// Método para insertar un nuevo Centro Deportivo en la base de datos
        /// </summary>
        /// <param name="datosCentroDeportivo">Modelo con los datos del Centro Deportivo a insertar (previamente validados)</param>
        /// <seealso cref="CentroDeportivo"/>
        /// <seealso cref="GestorBBDD"/>
        public void Insertar(LAPI.Data.Model.CentroDeportivo datosCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Insert into ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" ( ");
            sql.Append(datosCentroDeportivo.ToInsertColumns());
            sql.Append(" ) values ( ");
            sql.Append(datosCentroDeportivo.ToInsertValues());
            sql.Append(" ) ");            

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Insert(sql.ToString());               
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha insertado el registro: " + datosCentroDeportivo);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha insertado el registro: " + datosCentroDeportivo);
            }           
        }

        #endregion

        #region update

        /// <summary>
        /// Método para actualizar los datos 'cambiantes' del Centro Deportivo.
        /// </summary>
        /// <param name="datosCentroDeportivo">Modelo con los datos del Centro Deportivo</param>
        /// <seealso cref="CentroDeportivo"/>
        /// <seealso cref="GestorBBDD"/>
        public void Actualizar(LAPI.Data.Model.CentroDeportivo datosCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" set ");
            sql.Append(datosCentroDeportivo.ToUpdate());
            sql.Append(" where id_centrodeportivo =" + datosCentroDeportivo.idCentroDeportivo);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosCentroDeportivo);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosCentroDeportivo);
            }
        }

        /// <summary>
        /// Método para actualizar el estado del Centro Deportivo.
        /// </summary>
        /// <param name="datosCentroDeportivo">Modelo con los datos del Centro Deportivo</param>
        /// <seealso cref="CentroDeportivo"/>
        /// <seealso cref="GestorBBDD"/>
        public void ActualizarEstado(LAPI.Data.Model.CentroDeportivo datosCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Update ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" set ");
            sql.Append(datosCentroDeportivo.ToUpdateEstado());
            sql.Append(" where id_centrodeportivo =" + datosCentroDeportivo.idCentroDeportivo);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Update(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha actualizado el registro: " + datosCentroDeportivo);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha actualizado el registro: " + datosCentroDeportivo);
            }
        }

        #endregion

        #region delete

        /// <summary>
        /// Método para eliminar un Centro Deportivo.
        /// </summary>
        /// <param name="datosCentroDeportivo">Modelo con los datos del Centro Deportivo</param>
        /// <seealso cref="CentroDeportivo"/>
        /// <seealso cref="GestorBBDD"/>
        public void Eliminar(LAPI.Data.Model.CentroDeportivo datosCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Delete from ");
            sql.Append(LAPI.Data.Model.CentroDeportivo.Table);
            sql.Append(" where id_centrodeportivo =" + datosCentroDeportivo.idCentroDeportivo);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Delete(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha eliminado el registro: " + datosCentroDeportivo);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha eliminado el registro: " + datosCentroDeportivo);
            }
        }

        /// <summary>
        /// Método para eliminar los permisos administradores de un Centro Deportivo.
        /// </summary>
        /// <param name="datosCentroDeportivo">Modelo con los datos del Centro Deportivo</param>
        /// <seealso cref="CentroDeportivo"/>
        /// <seealso cref="GestorBBDD"/>
        public void EliminarPermisos(LAPI.Data.Model.CentroDeportivo datosCentroDeportivo)
        {
            System.Text.StringBuilder sql = new System.Text.StringBuilder();
            LAPI.Data.GestorBBDD oBBDD = LAPI.Data.GestorBBDDFactory.getGestorBBDD();
            Int32 result;

            sql.Append("Delete from admincentro");
            sql.Append(" where id_centrodeportivo =" + datosCentroDeportivo.idCentroDeportivo);

            try
            {
                oBBDD.Abrir();
                result = oBBDD.Delete(sql.ToString());
                oBBDD.CerrarParcial();
                if (result != 1)
                    throw new Exception("No se ha eliminado el registro: " + datosCentroDeportivo);
            }
            catch (Exception ex)
            {
                oBBDD.Cerrar();
                logger.Error(message: ex.Message, exception: ex);
                throw new Exception("No se ha eliminado el registro: " + datosCentroDeportivo);
            }
        }


        #endregion
    }
}
